package com.zsummer.zero.thread;

import java.util.LinkedList;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/**
 * volitaile �ɼ�����֤
 * ʹ���̰߳�ȫ����
 * 
 * �ڲ��Թ����У�ʹ������synchronized����ʹ���̰߳�ȫ���࣬�ﵽ�������Ľ���� ʹ��volatileδ�ܴﵽԤ�ڵ�Ч����������Ϊvolatile��֤�˲����ɼ��ԣ��޷���֤
 * ԭ������ɵġ�
 * 
 * ��˫��У��ĵ���ģʽ�У�ʹ��volatile�ؼ�������֤�����ԣ�������new����δ���֮ǰ���͸�ֵ������
 * @author zhouyujiang
 *
 */
public class ThreadDemo11 {
	// ��ʹ��volatileʱ�� ������У������ͬ
	// public static int cnt = 0;
	// ʹ��volatileʱ��������н����ͬ
	 public volatile static int cnt = 0;
	 public static Lock lock = new ReentrantLock();
	// ʹ��AtomicInteger �ﵽ�̰߳�ȫ��Ŀ��
	//public static AtomicInteger cnt = new AtomicInteger(0);
	
	public static void main(String[] args) {
		for (int i = 0; i < 10; i++) {
			new Thread(() -> {
				for (int j = 0; j < 100; j++) {
					//cnt.getAndAdd(1);
//					synchronized ("zzz") {
//						cnt++;
//					}
					lock.lock();
					cnt++;
					lock.unlock();
				}
			}).start();;
		}
		
		while (Thread.activeCount() > 1) { // ��֤ǰ����̶߳�ִ����
			Thread.yield();
		}
		System.out.println(cnt);
	}

}
